﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CdgNetPersistencia.Componentes;

/**
 * Autor: Cristian Daniel Garay Sosa
 * Fecha :  27/03/2012 (original)
 * Comentarios:
 *          lo que es una anotacion en Java, sirve para generar metadatos, en este caso relacionar
 *          un setter con el campo del cual recogera los datos
 * 
 * */

namespace CdgNetPersistencia.Atributos
{

    /// <summary>
    /// Atributo de relacion SETTER de OTD - CAMPOTABLA de TBL
    /// </summary>
    /// <see cref="http://msdn.microsoft.com/es-es/library/sw480ze8%28v=vs.80%29.aspx"/>
    [System.AttributeUsage(System.AttributeTargets.Method
                            , AllowMultiple = false)
    ]
    public class Campo : System.Attribute
    {

        #region PROPIEDADES

        /// <summary>
        /// Devuelve o establece el nombre del Campo
        /// </summary>
        private string __cNombre { get; set; }

        /// <summary>
        /// Devuelve o establece la posicion del campo
        /// </summary>
        private int __nIndice { get; set; }

        /// <summary>
        /// Devuelve o establece 
        /// </summary>
        private bool __bNulo { get; set; }

        /// <summary>
        /// Devuelve o establece el tipo de dato del campo
        /// </summary>
        private Type __tTipo { get; set; }

        /// <summary>
        /// Devuelve o establece si el campo es autogenerado por el SGBD
        /// </summary>
        private bool __bAutoGenerado { get; set; }

        /// <summary>
        /// Devuelve o establece la longitud del campo (solo para cadenas)
        /// </summary>
        public int nLargo { get; set; }



        #endregion



        #region CONSTRUCTORES

        /// <summary>
        /// Contructor de la Clase
        /// </summary>
        /// <param name="cNombreCampo">Nombre del Campo de Tabla, a referenciar</param>
        public Campo(string cNombreCampo)
        {
            this.__cNombre = cNombreCampo;
        }


        /// <summary>
        /// Constructor de la clase
        /// </summary>
        /// <param name="cNombreParam">Nombre del campo</param>
        /// <param name="nIndiceParam">Posicion que ocupa entre los demas campos</param>
        /// <param name="bNuloParam">Indica si el campo puede o no aceptar valores nulos</param>
        /// /// <param name="tTipoParam">Tipo de datos del atributo</param>
        public Campo(string cNombreParam, int nIndiceParam
                        , bool bNuloParam, Type tTipoParam)
        {
            this.__cNombre = cNombreParam;
            this.__nIndice = nIndiceParam;

            this.__bNulo = bNuloParam;

            this.__tTipo = tTipoParam;
            this.__bAutoGenerado = false;

        }

        /// <summary>
        /// Constructor de la clase
        /// </summary>
        /// <param name="cNombreParam">Nombre del campo</param>
        /// <param name="nIndiceParam">Posicion que ocupa entre los demas campos</param>
        /// <param name="bNuloParam">Indica si el campo puede o no aceptar valores nulos</param>
        /// <param name="tTipoParam">Tipo de datos del atributo</param>
        /// <param name="bAutoGeneradoParam">Indica si el campo es autogenerado o no por la SGBD</param>
        public Campo(string cNombreParam, int nIndiceParam
                        , bool bNuloParam, Type tTipoParam, bool bAutoGeneradoParam)
        {
            this.__cNombre = cNombreParam;
            this.__nIndice = nIndiceParam;

            this.__bNulo = bNuloParam;

            this.__tTipo = tTipoParam;
            this.__bAutoGenerado = bAutoGeneradoParam;

        }


        #endregion



        #region GETTERS Y SETTERS

        /// <summary>
        /// Devuelve el nombre del campo de la tabla
        /// </summary>
        public string GetNombre
        {
            get {return __cNombre;}
        }

        /// <summary>
        /// Devuelve la posicion del campo en el conjunto
        /// </summary>
        public int GetIndice 
        {
            get { return __nIndice; }
        }

        /// <summary>
        /// Duevelve 'True' si el campo acepta valores Nulos
        /// </summary>
        public bool EsNulo
        {
            get { return __bNulo; }
        }

        /// <summary>
        /// Devuelve el Tipo de dato del Campo
        /// </summary>
        public Type GetTipo
        {
            get { return __tTipo; }
        }

        /// <summary>
        /// Devuelve 'True' si el campo es autogenerado en la bd
        /// </summary>
        public bool EsAutoGenerado
        {
            get { return __bAutoGenerado; }
        }


#endregion 

    }
}
